package com.wander.patterns.create.singleton;

import java.util.concurrent.CountDownLatch;

/**
 * @description:单例模式 内存占用小减少性能开销
 * 懒汉式:线程安全 调用效率高 不能懒加载
 * 饿汉式:线程安全 调用效率不高 但是能懒加载
 * 双重检测锁方式 : 不推荐使用
 * 静态内部类方式 : 线程安全 调用效率高 且能懒加载
 * 枚举单例方式  : 线程安全 调用效率高 不能懒加载
 *
 * @author: zhuyong
 * @create: 2019-09-04 13:55
 **/
public class Client {
    public static void main(String[] args) throws InterruptedException {
//        HungSingleton singleton = HungSingleton.getInstance();
//        HungSingleton singleton2 = HungSingleton.getInstance();
//        System.out.println(singleton == singleton2);
//
//        System.out.println(EnumSingleton.INSTANCE==EnumSingleton.INSTANCE);


        //使用多线程环境测试性能
        long start = System.currentTimeMillis();

        int threadCount = 10;
        CountDownLatch countDownLatch = new CountDownLatch(threadCount);
        for (int i=0;i<threadCount;i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 100000; i++) {
                        Object o = HungSingleton.getInstance();//空间换时间
//                        Object o = LazySingleton.getInstance(); //加锁肯定是效率最低的
//                        Object o = StaticInnerClassSingleton.getInstance();
                        //Object o = EnumSingleton.INSTANCE;
                    }
                    countDownLatch.countDown();//一个线程进来之后 计数器-1
                }
            }).start();
        }
        countDownLatch.await();//主线程等待 知道线程执行完成
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

}
